<?php
class LogicTreeNodeDAO implements IDAO
{
	static function getFolderNameById($id)
	{
		require_once "classes/persistence/DBManager.php";
		$db = DBManager::getConnection();
		
		$dbNode = $db->fetchAll("SELECT NODO_NOMBRE FROM NODOS WHERE ID = $id");
		$element = $dbNode[0];
		
		$name = $element["NODO_NOMBRE"];
		
		$db->closeConnection();
		
		return $name;
	}
	
	/**
	 * Obtiene un árbol (o subárbol) según su id.
	 * @param integer $id El id de la raíz del árbol a obtener.
	 * @return LogicTreeNode El nodo (o árbol) obtenido.
	 */
	static function getTreeById($id, $level = 0)
	{
		require_once "classes/persistence/DBManager.php";
		$db = DBManager::getConnection();
		
		$dbNode = $db->fetchAll("SELECT * FROM NODOS WHERE ID = $id");
		// Como la búsqueda es por id, va a devolver un solo resultado.
		$element = $dbNode[0];
		$name = $element["NODO_NOMBRE"];
		
		$dbSiblings = $db->fetchAll("SELECT ID FROM NODOS WHERE NODO_PADRE_FK = $id");
		$siblingsIds = LogicTreeNodeDAO::extractIds($dbSiblings);
		$siblings = array();
		$i = 0;
		// Defino el nivel de todos los hijos de este nodo.
		$newLevel = $level + 1;
		foreach($siblingsIds as $siblingId){
			$siblings[$i] = LogicTreeNodeDAO::getTreeById($siblingId, $newLevel);
			$i++;
		}
		require_once "classes/model/LogicTreeNode.php";
		$node = new LogicTreeNode($name, $siblings, $level, $id);
		
		$db->closeConnection();
		
		return $node;
	}
	
	static function extractIds($dbSiblings)
	{
		$ids = array();
		$i = 0;
		foreach($dbSiblings as $dbSibling){
			$id = $dbSibling["ID"];
			$ids[$i] = $id;
			$i++;
		}
		return $ids;
	}
	
	/**
	 * Encuentra todos los �rboles.
	 * @return Array Una lista con un nodo por cada ra�z de �rbol (con toda
	 * la estructura cargada).
	 */
	static function findTrees()
	{
		$db = DBManager::getConnection();
		
		$results = $db->fetchAll("SELECT * FROM NODOS WHERE NODO_PADRE_FK IS NULL");
		$raices = nodosFromResults($results);
		
		$db->closeConnection();
		
		return $raices;
	}
	
	/**
	 * Persiste un nodo.
	 * @param LogicTreeNode $node El nodo a persistir.
	 * @param integer $idParent El id del módulo en el que se debe alojar este.
	 */
	function persist($node){
		$db = DBManager::getConnection();
		
		$id = $node->getId();
		$name = $node->getName();
		$idParent = $node->getIdParent();
		// Veo si ya está persistido.
		$result = $db->fetchAll("SELECT * FROM NODOS WHERE ID = $id");
		
		if(empty($result)){
			$query = "INSERT INTO NODOS(ID, NODO_NOMBRE, NODO_PADRE_FK) VALUES($id, '$name', $idParent)";
			$db->query($query);
		} else{
			$db->query("UPDATE NODOS SET NODO_NOMBRE = '$name', NODO_PADRE_FK = $idParent WHERE ID = $id");
		}
		
		foreach($node->getSiblings() as $sibling){
			PersistenceController::persist($sibling, $this);
		}
		
		$db->closeConnection();
	}
}